    var $ = {
    	noop: function() {}
    }

    var jsonType = 'application/json';
    var htmlType = 'text/html';
    var rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi;
    var scriptTypeRE = /^(?:text|application)\/javascript/i;
    var xmlTypeRE = /^(?:text|application)\/xml/i;
    var blankRE = /^\s*$/;
    $.parseJSON = JSON.parse;

    $.ajaxSettings = {
    	type: 'GET',
    	beforeSend: $.noop,
    	success: $.noop,
    	error: $.noop,
    	complete: $.noop,
    	context: null,
    	xhr: function(protocol) {
    		return new window.XMLHttpRequest();
    	},
    	accepts: {
    		script: 'text/javascript, application/javascript, application/x-javascript',
    		json: jsonType,
    		xml: 'application/xml, text/xml',
    		html: htmlType,
    		text: 'text/plain'
    	},
    	timeout: 0,
    	processData: true,
    	cache: true
    };
    var ajaxBeforeSend = function(xhr, settings) {
    	var context = settings.context
    	if (settings.beforeSend.call(context, xhr, settings) === false) {
    		return false;
    	}
    };
    var ajaxSuccess = function(data, xhr, settings) {
    	// cc.log('gggggg');
    	settings.success.call(settings.context, data, 'success', xhr);
    	ajaxComplete('success', xhr, settings);
    };
    // type: "timeout", "error", "abort", "parsererror"
    var ajaxError = function(error, type, xhr, settings) {
    	settings.error.call(settings.context, xhr, type, error);
    	ajaxComplete(type, xhr, settings);
    };
    // status: "success", "notmodified", "error", "timeout", "abort", "parsererror"
    var ajaxComplete = function(status, xhr, settings) {
    	settings.complete.call(settings.context, xhr, status);
    };

    var serialize = function(params, obj, traditional, scope) {
    	var type, array = $.isArray(obj),
    		hash = $.isPlainObject(obj);
    	$.each(obj, function(key, value) {
    		type = $.type(value);
    		if (scope) {
    			key = traditional ? scope :
    				scope + '[' + (hash || type === 'object' || type === 'array' ? key : '') + ']';
    		}
    		// handle data in serializeArray() format
    		if (!scope && array) {
    			params.add(value.name, value.value);
    		}
    		// recurse into nested objects
    		else if (type === "array" || (!traditional && type === "object")) {
    			serialize(params, value, traditional, key);
    		} else {
    			params.add(key, value);
    		}
    	});
    };
    var serializeData = function(options) {
    	if (options.processData && options.data && typeof options.data !== "string") {
    		var contentType = options.contentType;
    		if (!contentType && options.headers) {
    			contentType = options.headers['Content-Type'];
    		}
    		if (contentType && ~contentType.indexOf(jsonType)) { //application/json
    			options.data = JSON.stringify(options.data);
    		} else {
    			options.data = $.param(options.data, options.traditional);
    		}
    	}
    	if (options.data && (!options.type || options.type.toUpperCase() === 'GET')) {
    		options.url = appendQuery(options.url, options.data);
    		options.data = undefined;
    	}
    };
    var appendQuery = function(url, query) {
    	if (query === '') {
    		return url;
    	}
    	return (url + '&' + query).replace(/[&?]{1,2}/, '?');
    };
    var mimeToDataType = function(mime) {
    	if (mime) {
    		mime = mime.split(';', 2)[0];
    	}
    	return mime && (mime === htmlType ? 'html' :
    		mime === jsonType ? 'json' :
    		scriptTypeRE.test(mime) ? 'script' :
    		xmlTypeRE.test(mime) && 'xml') || 'text';
    };
    var parseArguments = function(url, data, success, dataType) {
    	// cc.log('sssss'+success);
    	if ($.isFunction(data)) {
    		dataType = success, success = data, data = undefined;
    	}
    	if (!$.isFunction(success)) {
    		dataType = success, success = undefined;
    	}
    	return {
    		url: url,
    		data: data,
    		success: success,
    		dataType: dataType
    	};
    };
    $.ajax = function(url, options) {

    	if (typeof url === "object") {
    		options = url;
    		url = undefined;
    	}
    	// 		 cc.log('dddd');
    	// 	    cc.log(options);
    	var settings = options || {};
    	settings.url = url || settings.url;
    	for (var key in $.ajaxSettings) {
    		if (settings[key] === undefined) {
    			settings[key] = $.ajaxSettings[key];
    		}
    	}
    	serializeData(settings);
    	var dataType = settings.dataType;

    	if (settings.cache === false || ((!options || options.cache !== true) && ('script' === dataType))) {
    		settings.url = appendQuery(settings.url, '_=' + $.now());
    	}
    	var mime = settings.accepts[dataType && dataType.toLowerCase()];
    	var headers = {};
    	var setHeader = function(name, value) {
    		headers[name.toLowerCase()] = [name, value];
    	};
    	var protocol = /^([\w-]+:)\/\//.test(settings.url) ? RegExp.$1 : window.location.protocol;
    	var xhr = settings.xhr(settings);
    	var nativeSetHeader = xhr.setRequestHeader;
    	var abortTimeout;

    	setHeader('X-Requested-With', 'XMLHttpRequest');
    	setHeader('Accept', mime || '*/*');
    	if (!!(mime = settings.mimeType || mime)) {
    		if (mime.indexOf(',') > -1) {
    			mime = mime.split(',', 2)[0];
    		}
    		xhr.overrideMimeType && xhr.overrideMimeType(mime);
    	}
    	if (settings.contentType || (settings.contentType !== false && settings.data && settings.type.toUpperCase() !== 'GET')) {
    		setHeader('Content-Type', settings.contentType || 'application/x-www-form-urlencoded');
    	}
    	if (settings.headers) {
    		for (var name in settings.headers)
    			setHeader(name, settings.headers[name]);
    	}
    	xhr.setRequestHeader = setHeader;

    	xhr.onreadystatechange = function() {

    		if (xhr.readyState === 4) {
    			xhr.onreadystatechange = $.noop;
    			clearTimeout(abortTimeout);
    			var result, error = false;
    			var isLocal = protocol === 'file:';
    			if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304 || (xhr.status === 0 && isLocal && xhr.responseText)) {

    				dataType = dataType || mimeToDataType(settings.mimeType || xhr.getResponseHeader('content-type'));
    				result = xhr.responseText;

    				try {
    					// http://perfectionkills.com/global-eval-what-are-the-options/
    					if (dataType === 'script') {
    						(1, eval)(result);
    					} else if (dataType === 'xml') {
    						result = xhr.responseXML;
    					} else if (dataType === 'json') {
                            //cc.log('result'+result);
    						result = blankRE.test(result) ? null : $.parseJSON(result);

    					}
    				} catch (e) {
    					error = e;
    				}

    				if (error) {
    					ajaxError(error, 'parsererror', xhr, settings);
    				} else {

    					ajaxSuccess(result, xhr, settings);
    				}
    			} else {
    				var status = xhr.status ? 'error' : 'abort';
    				var statusText = xhr.statusText || null;
    				if (isLocal) {
    					status = 'error';
    					statusText = '404';
    				}
    				ajaxError(statusText, status, xhr, settings);
    			}
    		}
    	};
    	if (ajaxBeforeSend(xhr, settings) === false) {
    		xhr.abort();
    		ajaxError(null, 'abort', xhr, settings);
    		return xhr;
    	}

    	if (settings.xhrFields) {
    		for (var name in settings.xhrFields) {
    			xhr[name] = settings.xhrFields[name];
    		}
    	}

    	var async = 'async' in settings ? settings.async : true;

    	xhr.open(settings.type.toUpperCase(), settings.url, async, settings.username, settings.password);

    	for (var name in headers) {
    		if (headers.hasOwnProperty(name)) {
    			nativeSetHeader.apply(xhr, headers[name]);
    		}
    	}
    	if (settings.timeout > 0) {
    		abortTimeout = setTimeout(function() {
    			xhr.onreadystatechange = $.noop;
    			xhr.abort();
    			ajaxError(null, 'timeout', xhr, settings);
    		}, settings.timeout);
    	}
    	xhr.send(); //settings.data ? settings.data : null);
    	return xhr;
    };

    $.param = function(obj, traditional) {
    	var params = [];
    	params.add = function(k, v) {
    		this.push(encodeURIComponent(k) + '=' + encodeURIComponent(v));
    	};
    	serialize(params, obj, traditional);
    	return params.join('&').replace(/%20/g, '+');
    };
    $.get = function( /* url, data, success, dataType */ ) {
    	return $.ajax(parseArguments.apply(null, arguments));
    };

    $.post = function( /* url, data, success, dataType */ ) {
    	var options = parseArguments.apply(null, arguments);
    	options.type = 'POST';
    	return $.ajax(options);
    };

    $.getJSON = function( /* url, data, success */ ) {
    	var options = parseArguments.apply(null, arguments);

    	options.dataType = 'json';
    	// cc.log('asdf:'+options);
    	return $.ajax(options);
    };

    $.load = function(url, data, success) {
    	if (!this.length)
    		return this;
    	var self = this,
    		parts = url.split(/\s/),
    		selector,
    		options = parseArguments(url, data, success),
    		callback = options.success;
    	if (parts.length > 1)
    		options.url = parts[0], selector = parts[1];
    	options.success = function(response) {
    		if (selector) {
    			var div = document.createElement('div');
    			div.innerHTML = response.replace(rscript, "");
    			var selectorDiv = document.createElement('div');
    			var childs = div.querySelectorAll(selector);
    			if (childs && childs.length > 0) {
    				for (var i = 0, len = childs.length; i < len; i++) {
    					selectorDiv.appendChild(childs[i]);
    				}
    			}
    			self[0].innerHTML = selectorDiv.innerHTML;
    		} else {
    			self[0].innerHTML = response;
    		}
    		callback && callback.apply(self, arguments);
    	};
    	$.ajax(options);
    	return this;
    };
    $.isFunction = function(value) {
    	return $.type(value) === "function";
    };
    $.type = function(obj) {
    	return obj == null ? String(obj) : class2type[{}.toString.call(obj)] || "object";
    };
    var class2type = {};
    /**
     * mui isObject
     */
    $.isObject = function(obj) {
    	return $.type(obj) === "object";
    };
    /**
     * mui isPlainObject
     */
    $.isPlainObject = function(obj) {
    	return $.isObject(obj) && Object.getPrototypeOf(obj) === Object.prototype;
    };
    $.isArray = Array.isArray ||
    	function(object) {
    		return object instanceof Array;
    	};
    $.each = function(elements, callback, hasOwnProperty) {
    	if (!elements) {
    		return this;
    	}
    	if (typeof elements.length === 'number') {
    		[].every.call(elements, function(el, idx) {
    			return callback.call(el, idx, el) !== false;
    		});
    	} else {
    		for (var key in elements) {
    			if (hasOwnProperty) {
    				if (elements.hasOwnProperty(key)) {
    					if (callback.call(elements[key], key, elements[key]) === false) return elements;
    				}
    			} else {
    				if (callback.call(elements[key], key, elements[key]) === false) return elements;
    			}
    		}
    	}
    	return this;
    };
    $.each(['Boolean', 'Number', 'String', 'Function', 'Array', 'Date', 'RegExp', 'Object', 'Error'], function(i, name) {
    	class2type["[object " + name + "]"] = name.toLowerCase();
    });
    module.exports = $;